﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using GestorDeFlotasModelo.Factorias;
using GestorDeFlotasModelo.Entities;
using GestorDeFlotasDesktop.UILogic;
using GestorDeFlotasDesktop.UILogic.Helpers;

namespace GestorDeFlotasDesktop
{
    public partial class AbmCliente : BaseForm
    {
        public FormMode Mode = FormMode.List;

        /// Esto es para cuando desde el formulario de facturación quiero seleccionar un item.
        /// Se abre el listado de clientes y luego el usuario selecciona uno. 
        /// Se lanza este evento y se setea el SelectedClient en el formulario de facturación.
        /// Luego se cierra este listado.
        public event SelectedItemEventHandler SelectingItem;

        public AbmCliente()
        {
            InitializeComponent();
        }

        protected virtual void OnSelectingItem(Cliente e)
        {
            try
            {
                if (SelectingItem != null)
                    SelectingItem(this, e);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        protected override void  OnVisibleChanged(EventArgs e)
        {
            try
            {
                base.OnVisibleChanged(e);
                List<Cliente> clientes = Transaccion.Factoria<FactoriaCliente>().SelectTodos<Cliente>();
                GridCreation();
                SetGridData(clientes);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        #region Grid Configuration
        private void GridCreation()
        {
            gvUsuarios.Columns.Clear();
            gvUsuarios.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
        }

        void gvUsuarios_SelectionChanged(object sender, EventArgs e)
        {
            
        }
        private void SetGridData(List<Cliente> clientes)
        {
            if (clientes != null && clientes.Count > 0)
            {
                //GridCreation();
                gvUsuarios.DataSource = clientes;
                gvUsuarios.Visible = true;
                lblNoItems.Visible = false;
            }
            else
            {
                lblNoItems.Visible = true;
                gvUsuarios.Visible = false;
            }
        }
        #endregion

        private void btnBuscar_Click(object sender, EventArgs e)
        {
            try
            {
                long dni = 0;
                if (!String.IsNullOrEmpty(txtDni.Text) && !Int64.TryParse(txtDni.Text, out dni))
                    lblDniError.Visible = true;
                else lblDniError.Visible = false;

                List<Cliente> clientes = Transaccion.Factoria<FactoriaCliente>().SelectPorFiltros(txtName.Text, txtLastName.Text, dni);
                SetGridData(clientes);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void AbmUsuario_Load(object sender, EventArgs e)
        {

        }

        private void btnModify_Click(object sender, EventArgs e)
        {
            try
            {
                if (gvUsuarios.SelectedRows.Count > 0)
                {
                    FormCliente frm = new FormCliente();
                    Cliente cliente = (Cliente)gvUsuarios.SelectedRows[0].DataBoundItem;
                    frm.LoadForm(FormMode.Update, cliente);
                    frm.Show();
                    this.Hide();
                }
                else
                {
                    MessageBox.Show("No has seleccionado ningun cliente para modificar");
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void btnDelete_Click(object sender, EventArgs e)
        {
            try
            {
                if (gvUsuarios.SelectedRows.Count > 0)
                {
                    Cliente cliente = (Cliente)gvUsuarios.SelectedRows[0].DataBoundItem;
                    cliente.Habilitado = false;
                    Transaccion.Persistir();
                    Transaccion.Factoria<FactoriaCliente>().Suplantar(cliente);
                    gvUsuarios.DataSource = Transaccion.Factoria<FactoriaCliente>().SelectTodos<Cliente>();
                }
                else
                {
                    MessageBox.Show("No has seleccionado ningun cliente para eliminar");
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void btnLimpiar_Click(object sender, EventArgs e)
        {

            txtDni.Text = txtLastName.Text = txtName.Text = string.Empty;
            gvUsuarios.DataSource = null;
            gvUsuarios.Rows.Clear();
        }

        private void gvUsuarios_SelectionChanged_1(object sender, EventArgs e)
        {
            
        }

        /// <summary>
        /// Cuando hago doble click sobre una fila disparo el evento SelectItem.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void gvUsuarios_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            try
            {
                if (gvUsuarios.SelectedRows.Count > 0 && gvUsuarios.SelectedRows[0].DataBoundItem != null && Mode == FormMode.SelectItem)
                    OnSelectingItem((Cliente)gvUsuarios.SelectedRows[0].DataBoundItem);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
    }
}